#ifndef DATABASESERVICE_H
#define DATABASESERVICE_H

#include <QObject>
#include <QTimer>
#include <QDateTime>
#include <Common/status_table.h>
#include <Common/hardware_task_queue.h>
#include "DatabaseManager.h"

class DatabaseService : public QObject
{
    Q_OBJECT

public:
    explicit DatabaseService(QObject* parent = nullptr);
    ~DatabaseService();

    // 数据库连接管理
    Q_INVOKABLE bool initialize(const QString& host = "127.0.0.1",
                                int port = 3306,
                                const QString& database = "MzPoliShineDB",
                                const QString& username = "remote_user",
                                const QString& password = "123456");

    Q_INVOKABLE void disconnect();
    Q_INVOKABLE bool isConnected() const;
    Q_INVOKABLE QString getConnectionStatus() const;

    // 任务轮询控制
    Q_INVOKABLE void startTaskPolling(int intervalMs = 300);
    Q_INVOKABLE void stopTaskPolling();

    // 状态监控控制
    Q_INVOKABLE void startStatusMonitoring(int intervalMs = 300);
    Q_INVOKABLE void stopStatusMonitoring();

    // 参数管理
    Q_INVOKABLE QVariantMap getAlgorithmParams(const QString& algorithmName, const QString& version = "1.0");
    Q_INVOKABLE QVariantMap getMachineParams(const QString& settingName);

    // 状态更新
    Q_INVOKABLE bool updateMachineStatus(const QVariantMap& statusData);
    Q_INVOKABLE bool addRecord(const QVariantMap& recordData);

    // 初始化状态记录
    Q_INVOKABLE bool initializeStatusRecord();

    // 状态数据生成（用于测试和演示）
    Q_INVOKABLE QVariantMap generateMachineStatusData(int runStatus = 2, int alarmStatus = 0);
    Q_INVOKABLE QVariantMap generateSimulatedMachineStatus();

    // ==================== 新增状态表管理接口 ====================
    Q_INVOKABLE StatusTable getCurrentStatusTable();
    Q_INVOKABLE bool updateStatusTable(const StatusTable& status);
    Q_INVOKABLE bool saveStatusTable(const StatusTable& status);
    Q_INVOKABLE StatusTable loadStatusTable();

    // 便捷状态设置方法
    Q_INVOKABLE void setCameraConnected(bool connected);
    Q_INVOKABLE void setDeviceConnected(bool connected);
    Q_INVOKABLE void setRunStatus(int status);
    Q_INVOKABLE void setAlarmStatus(int status);

signals:
    // 数据库状态信号
    void databaseConnected(bool success, const QString& message);
    void databaseDisconnected();

    // 任务处理信号
    void taskReceived(const QVariantMap& task);
    void taskExecuted(qint64 taskId, bool success, const QString& message);

    // 状态更新信号
    void statusUpdated(const QVariantMap& statusData);
    void recordAdded(const QVariantMap& recordData);

    // ==================== 新增状态表信号 ====================
    void statusTableChanged(const StatusTable& status);
    void cameraConnectionChanged(bool connected);
    void deviceConnectionChanged(bool connected);
    void runStatusChanged(int status);

    // 日志信号
    void logMessage(const QString& message);



private slots:
    void onTaskPollingTimeout();
    void onStatusMonitoringTimeout();

private:
    // 任务处理
    void processPendingTasks();
    void executeTask(const QVariantMap& task);

    HardwareTaskQueue convertToTaskStruct(const QVariantMap& taskData);

    // 状态更新
    void updateSystemStatus();

    // 工具方法
    QVariantMap getCurrentMachineStatus();
    QJsonObject convertStatusToJson(const QVariantMap& status);
    void log(const QString& message);

    // ==================== 新增状态表方法 ====================
    StatusTable convertToStatusTable(const QVariantMap& statusData);
    QVariantMap convertFromStatusTable(const StatusTable& statusTable);
    QString getRunStatusText(RunStatus status);

    // 使用 DatabaseManager 单例
    DatabaseManager& m_databaseManager;
    QTimer* m_taskPollingTimer;
    QTimer* m_statusMonitoringTimer;
    bool m_isConnected;

    // 缓存常用参数
    QVariantMap m_currentAlgorithmParams;
    QVariantMap m_currentMachineParams;

    // ==================== 新增状态表缓存 ====================
    StatusTable m_currentStatusTable;  // 当前状态表缓存
    QString m_connectionInfo;

};

#endif // DATABASESERVICE_H
